"""
同步和异步
    同步：多任务，多个任务之间执行的时候是有先后顺序的，必须一个先执行完成之后，另外一个才能继续执行。
        只有一个主线：等我说完你再说 (同一时间只能做一件事)
    异步：多个任务直接按没有执行的先后顺序，可以同时运行，执行的先后顺序不会有什么影响，存在的多条任务主线。
         发微信（可以不等待对方回复，继续发）  点外卖（点了外卖后，我们可以继续玩游戏）

 想完成同步线程，必须用到线程锁
     线程锁的机制：当线程获取资源后，立刻进行锁定，资源使用完毕后再解锁，有效的保证同一时间只有一个线程资源在使用

 实现锁的方式：
    创建锁
     lock = threading.Lock()
    锁定
    lock.acquire()
    解锁
    lock.release()
"""
"""
1.创建一把互斥锁
2.在使用资源前要锁定资源
3.使用资源之后，要解锁资源

有两个任务 work1 work2  查看work1线程对全局变量进行修改，在work2能否查看到修改后的结果
"""
import threading
import time

#定义全局变量
g_num = 0

#work1
def work1():
    #声明g_num是一个全局变量
    global g_num
    #上锁
    lock1.acquire()
    #使用资源
    for i in range(100000000):
        g_num += 1
    #解锁
    lock1.release()
    print("work1-------------------", g_num)

def work2():
    #声明g_num是一个全局变量
    global g_num
    #上锁
    lock1.acquire()
    #使用资源
    for i in range(10):
        g_num += 1
    #解锁
    lock1.release()
    print("work2-------------------", g_num)

if __name__ == '__main__':
    lock1 = threading.Lock()
    t1 = threading.Thread(target=work1) # 当t1在对全局变量进行修改的时候 t2是不会对对全局变量进行操作的
    t2 = threading.Thread(target=work2) # 当t1 释放锁后 t2才会去执行
    t1.start()
    t2.start()

    while (len(threading.enumerate())) != 1:
        time.sleep(1)
    print("main-------------------", g_num)
